 PAG
**********************************
*  SEGONEFONE
**********************************

 ORG $C800  ;RUNS FROM $C800

*************** MESSAGES *************

MSGINVBP
 DFB CR
 ASC "INVALID ADDRESS"
 DFB BEL,CR,EOT

* MESSAGE "BREAK"

MSGBRKPT
 DFB CR
 ASC "BREAKS"
 DFB CR,EOT

MSGHARDB
 DFB CR
 ASC "HARDWARE BREAK"
 DFB CR,EOT

MSGAVAIL
 ASC "M or ?"
 DFB 05
 ASC "Menu"
 DFB 24 
 ASC "MD [A]"
 DFB 05
 ASC "Mem Dump"
 DFB CR

 ASC "MO"
 DFB 09
 ASC "Mode"
 DFB 24
 ASC "MW"
 DFB 09
 ASC "Mem Wind"
 DFB CR

 ASC "esc"
 DFB 8
 ASC ": level"
 DFB 21
 ASC "MM [A]"
 DFB 05
 ASC "Mem Mod"
 DFB CR

 ASC "SS A"
 DFB 07
 ASC "Set Switch"
 DFB 18
 ASC "MA [A]"
 DFB 05
 ASC "Mini Assem"
 DFB CR

 ASC "SD T"
 DFB 07
 ASC "Set Disp"
 DFB 20
 ASC "PW"
 DFB 09
 ASC "Prot Wind"
 DFB CR

 ASC "ON"
 DFB 38
 ASC "RT"
 DFB 09
 ASC "Real Time"
 DFB CR

 ASC "OFf"
 DFB 37
 ASC "down"
 DFB 07
 ASC "Skip"
 DFB CR
 DFB EOT

MSGAVAL2

 ASC "KEy"
 DFB 08
 ASC "Set"
 DFB 25
 ASC "TR [N]"
 DFB 05
 ASC "Trace"
 DFB CR

 ASC "SB [T A.N]"
 DFB 01
 ASC "Set BRK"
 DFB 21
 ASC "TS A"
 DFB 07
 ASC "Trace w/Sub"
 DFB CR

 ASC "RB A"
 DFB 07
 ASC "Remove BRK"
 DFB 18
 ASC "EX [N]"
 DFB 05
 ASC "Execute"
 DFB CR

 ASC "HB [A]"
 DFB 05
 ASC "Hard BRK"
 DFB 20
 ASC "ER"
 DFB 09
 ASC "EX to RTS"
 DFB CR

 ASC "RH"
 DFB 09
 ASC "Remove HB"
 DFB 19
 ASC "ET A.A"
 DFB 05
 ASC "EX Time"
 DFB CR

 ASC "RA"
 DFB 09
 ASC "Remove All"
 DFB 18
 ASC "GO [A]"
 DFB 05
 ASC "Run"
 DFB CR

 ASC "Li [A]"
 DFB 05
 ASC "List"
 DFB 24
 ASC "JS A"
 DFB 07
 ASC "JSR A"
 DFB CR

 ASC "DR"
 DFB 09
 ASC "Disp Reg's"
 DFB 18
 ASC "*"
 DFB 10
 ASC "Mon"
 DFB CR

 ASC "R=n"
 DFB 08
 ASC "REG=n"
 DFB 23
 ASC "QUit"
 DFB CR
 DFB EOT

* MSGFLAGS

MSGFLAGS
 DFB CR
 ASC "FLAGS  NV1BDIZC"
 DFB CR
 ASC "STATUS "
 DFB EOT

* MSGENTER

MSGENTER
 DFB CR
 ASC "Enter "
 DFB EOT

MSGREAL DFB CR
 ASC "Real BRKs in"
 DFB BEL
 DFB EOT

*********************************************
*  MAKE SURE THIS POINT IS $CA00 OR HIGHER  *
*********************************************

 DS $CA00-*,$FF

* COME HERE FROM LOWER 2K
* MAKE SURE THAT THE INSTRUCTIONS DO NOT BEGIN UNTIL $CA00.

********************************
*  COMDDOTP
********************************

COMDDOTP
 BEQ COMDPP  ;COMMAND IS .P
* COMMAND IS .P WITH NUMBER
 JSR CHKREAD  ;CHECK FOR HEX AND READ
 BCS COMDPP  ;IF NOT HEX
 STA STATUS  ;CHANGE STATUS
PPMAIN10
 JMP MAIN11

* COMMAND IS .P WITH NO NUMBER, CHANGE INDIVIDUAL FLAGS,
* DISPLAY THE FLAGS

COMDPP JSR WRINIT1
:MORE LDA MSGFLAGS,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE

 LDX #8
 LDA STATUS

*DISPLAY THE CURRENT STATUS

DISPSTAT
 ASL
 PHA
 BCS FLAGON
 LDA #"0"
 BNE DISPIOR0
FLAGON LDA #"1"
DISPIOR0
 JSR TRANSFR1
 DFB COUTC  ;CODE
 PLA
 DEX
 BNE DISPSTAT

* DISPLAY "ENTER"

 JSR WRINIT1
:MORE LDA MSGENTER,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE

 LDA #$A0
 STA PROMPT
 JSR TRANSFR1 ;GET INPUT NO CR
 DFB GETLNC  ;CODE
 LDY #00  ;8 BITS + 1

* RECOGNIZES ONLY 0 AND 1, EVERYTHING ELSE IS TREATED AS SPACE

NEXTFLAG
 LDX IN,Y
 INY
 CPY #9
 BGE PPMAIN10
 CPX #"1"
 BNE CHKZERO  ;IF NOT 1
 TYA
 TAX
 LDA #0
 SEC
MOVEONE ROR
 DEX
 BNE MOVEONE
 ORA STATUS
SAVESTAT
 STA STATUS
 JMP NEXTFLAG
CHKZERO CPX #"0"
 BNE CHKRETRN
 TYA
 TAX
 LDA #$FF
 CLC
MOVEZERO
 ROR
 DEX
 BNE MOVEZERO
 AND STATUS
 JMP SAVESTAT
CHKRETRN
 CPX #CR
 BEQ PPMAIN10
 BNE NEXTFLAG

********************
*  COMD PC=        *
********************

COMDPC JSR GETCHR  ;DOES DATA FOLLOW
 BNE :CONT  ;IF YES
 LDA #NUMEXP  ;ERROR NUMBER FOR NUMBER EXPECTED
 BNE ERREXIT1
:CONT JSR GETPPC  ;LOAD PC WITH DATA
 BCC OKEXIT1  ;IF DATA WAS OK	
BADPARX LDA #BADPAR  ;BAD PARAMETER ERROR NUMBER

ERREXIT1
 JSR TRANSFR1 ;IF NO
 DFB ERRBEEPC ;code
OKEXIT1 JMP MAIN11

GETPPC JSR CHKREAD  ;CHECK FOR HEX AND READ
 BCS :ERR  ;IF NOT HEX
 STA PCLO  ;CHANGE PC
 STA MEMLOW
 LDA LETTER2
 STA PCHI  ;CHANGE PC
 STA MEMHI  ;USED BY BANKCHEK
 JSR TRANSFR1 ;GET BANK #
 DFB BANKCHEKC ;code
 STA PBR
 CLC   ;NO ERRORS
:ERR RTS

********************************
*  COMDPA
********************************

COMDPA JSR CHKREAD  ;CHECK FOR HEX AND READ
 BCS BADPARX  ;IF NOT HEX
 STA ACC  ;CHANGE ACC
 JMP MAIN11

********************************
*  COMDPX
********************************

COMDPX JSR CHKREAD
 BCS BADPARX 
 STA XREG  ;CHANGE XREG
 JMP MAIN11

********************************
*  COMDPY
********************************

COMDPY JSR CHKREAD
 BCS BADPARX
 STA YREG  ;CHANGE YREG
 JMP MAIN11

********************************
*  COMDPS
********************************

COMDPS JSR CHKREAD
 BCS BADPARX
 STA STACK  ;CHANGE STACK
 JSR TRANSFR1 ;UPDATE STACK WINDOW
 DFB DISSTKWC ;code
 JMP SETDRW  ;SET DR WINDOW

******************************
*   COMDGO [A] - RUN PROGRAM *
******************************

COMDGO BEQ GOATPC  ;NO PC FOLLOWS, RUN AT CURRENT PC
 JSR GETPPC  ;LOAD PC WITH ADDRESS
TOBPX BCS BADPARX  ;IF NOT VALID ADDRESS

* TRACE 1 INSTRUCTION THEN GO

GOATPC LDA #EXECUTE ;LOW BYTE
 STA ENABLTVC
 LDA #>EXECUTE ;HI BYTE
 STA ENABLTVC+1
 JSR TRANSFR1 ;RUN USERS PROGRAM
 DFB STEP1C  ;code <NO RETURN>

********************************
*  COMDSB - SET BREAK 
********************************

* SB (TYPE) (LOCATION) . (# OF TIME TO PASS)
* SB   R      012003   .    1000
*          LETTER 3,2,1     LETTER 6,5,4

COMDSB EQU *
 BEQ BKPDIS  ;IF NO DISPLAY BREAKPOINTS
 CMP #"R"  ;CHECK TYPE
 BEQ :TYPEOK  ;IF VALID
 CMP #"I"  ;CHECK TYPE
 BEQ :TYPEOK  ;IF VALID
 LDA #"R"  ;DEFAULT TO REAL
 DEY   ;PUT POINTERS BACK TO
 INX   ;.. LAST CHAR
:TYPEOK STA SBTYPE  ;SAVE TYPE
 JSR CHKREADA
 BCS TOBPX  ;IF NOT HEX
 BIT ADDRS2F  ;2 NUMBERS INPUT ?
 BMI :TWO  ;IF YES
 LDA #0
 STA LETTER5  ;
 LDA #1
 STA LETTER4  ;DEFAULT TO 1 ON # OF TIMES TO PASS
:TWO LDA POINT  ;SEE IF THERE IS ROOM FOR ANOTHER BREAK
 CMP #50  ;50 BREAKS
 BLT NOTFULL  ;IF OK
 LDA #BRKFUL  ;ERROR NUMBER
SBERR JMP ERREXIT1 ;NO ROOM
NOTFULL JSR TRANSFR1 ;PUT BRK & UPDATE BRK STACK (Z=0 NOT RAM)
 DFB PUTBREAKC ;CODE
 BEQ ISRAM  ;LOCATION IS RAM
NOTRAM JSR TRANSFR1 ;DISPLAY MESSAGE
 DFB DISNOTRMC ;CODE
ISRAM JSR TRANSFR1 ;USE THIS TO SET BRK WINDOW
 DFB DISBRKWC ;code
 JSR TRANSFR1 ;CLEAR HOME
 DFB CLRHOMEC ;code
 JSR TRANSFR1 ;UPDATE BRK WINDOW
 DFB DISBRKWC ;code
 JSR TRANSFR1 ;UPDATE FLAG WINDOW
 DFB DISFLGWC ;code
SETDRW JSR TRANSFR1 ;SET DR WINDOW
 DFB WINDDRC  ;code
 JMP MAIN11
BKPDIS JSR DISBKP  ;DISPLAY BREAKPOINTS
 JMP MAIN11

********************************
*  COMDHB - SET HARDWARE BREAK
********************************

COMDHB EQU *
 BEQ SHDIS  ;NOTHING THERE SO DISPLAY BREAKPOINTS
 JSR CHKREAD  ;CHECK FOR HEX AND READ
TOBPX2 BCS TOBPX  ;IF ERROR
 STA VIAORA  ;STORE IN LOW BYTE OF COMPARATOR
 LDA LETTER2  ;GET HI BYTE
 STA VIAORB  ;STORE IN HI BYTE
 LDA LETTER3
 STA HARDPBR  ;BANK TO STOP IN
 LDA #%10010000
 ORA IERBUFF  ;ENABLE HARDWARE BREAK
 STA IERBUFF
 BNE NODISH
SHDIS JSR DISHB  ;DISPLAY HARDWARE BREAK
NODISH JMP ISRAM  ;UPDATE BRK WINDOW	
HBERR JMP ERREXIT1 ;IF NOT HEX

********************************
*  COMDRB - REMOVE BREAK
********************************

* RB 012003

COMDRB EQU *
 BEQ TOBPX2  ;IF NO ADDRESS FOLLOWS
 JSR CHKREAD  ;READ ADDRS INTO LETTER 3,2,1
 BCS TOBPX2  ;IF NOT HEX
 JSR TRANSFR1 ;SEE IF ADDRESS IS ON LIST
 DFB VALIDADC ;code
 BMI INVBREAK ;INVALID BREAKPOINT

* THE FOLLOWING SUBROUTINE REPLACES BREAKPOINT IN PROGRAM
* WITH ORIGINAL DATA. REMOVES FROM BREAKS BUFFER, AND
* REORGANIZES LIST. ENTER WITH Y POINTING AT BRK.

 JSR TRANSFR1 ;REPLACE BRK WITH ORIG DATA
 DFB REPLACEC ;code
 JMP ISRAM  ;UPDATE BRK WINDOW

INVBREAK
 JSR DISINVBP ;DISPLAY "INVALID BRK ADDRS"
RBTOM11 JMP MAIN11

********************************
*  COMDRH - REMOVE HARDWARE BREAK
********************************

COMDRH JSR CLRHARD  ;CLEAR HARDWARE BREAK
 JMP ISRAM  ;UPDATE BRK WINDOW

********************************
*  COMDRA - REMOVE ALL BREAKS
********************************

COMDRA JSR CLEARALL ;REPLACE ALL BREAKPOINTS WITH ORIGINAL DATA
 JMP ISRAM  ;UPDATE BRK WINDOW

********************************
*  COMDMM - MEMORY MODIFY
********************************

COMDMM EQU *
 BEQ :MMNOADD ;IF NO ADDRESS FOLLOWS
 JSR TRANSFR1 ;GET ADDRESS
 DFB LOADMEMC ;CODE
 BCS TOERR1
:MMNOADD
 JSR DSMEMCOL ;DISPLAY MEM POINTER :
 LDY #0
 JSR SPCBYTE  ;DISPLAY SPACE, BYTE
 LDA #$A0
 JSR TRANSFR1 ;SPACE
 DFB COUTC  ;code
 JSR TRANSFR1 ;READ NEXT CHARACTER
 DFB RDCHARC  ;CODE
 CMP #UPARROW
 BEQ :MMDECP  ;IF UP ARROW
 CMP #DNARROW
 BEQ :INCWCR  ;IF DOWN ARROW
 CMP #CR  ;IS IT RETURN
 BEQ :INCWCR  ;IF YES GO TO NEXT ADDR
 LDX #0
 JSR TRANSFR1 ;GET INPUT NUMBER
 DFB GETLNNOC ;code
 BCS RBTOM11  ;<esc> key so return to command level
 INX   ;MAKE X > 0
 LDY #0  ;FIRST CHAR
 JSR CHKREADA ;CHECK FOR HEX AND READ
 BCS :MMERR  ;IF NOT HEX
 JSR TRANSFR1 ;INIT LOWADD, STORE ACC, AND VERIFY
 DFB INITMMVC ;CODE
 BEQ :INCPC  ;IF OK
:MMERR BEQ RBTOM11  ;GO TO COMMAND LEVEL
 JSR TRANSFR1 ;IF NO, BEEP
 DFB BELLC  ;CODE
 JMP :MMNOADD ;DISPLAY
:INCWCR JSR TRANSFR1
 DFB CROUTC  ;CODE
:INCPC JSR TRANSFR1 ;INCREMENT MEMLOW & MEMHI
 DFB INCMEMLHC ;CODE
 JMP :MMNOADD ;NEXT LOCATAION
:MMDECP JSR TRANSFR1
 DFB CROUTC  ;code
 JSR TRANSFR1
 DFB DECMEMLHC ;code
 JMP :MMNOADD ;GO BACK ONE ADDRESS

********************************
*  COMDMD - MEMORY DISPLAY
********************************

COMDMD EQU *
 BEQ MDNOADDR ;IF NO ADDRESS FOLLOWS
 JSR TRANSFR1 ;GET ADDRESS
 DFB LOADMEMC ;CODE
 BCC MDNOADDR
TOERR1 JMP BADPARX
MDNOADDR
 JSR TRANSFR1 ;FULL SCREEN
 DFB WINDFULC ;CODE
MDAGAIN LDA #16  ;DISPLAY  256 bytes
MDLOOP PHA   ;SAVE
 JSR MEMDISP  ;DISPLAY LINE OF MEMORY
 CLC
 LDA MEMLOW
 ADC #16
 STA MEMLOW
 LDA MEMHI
 ADC #0
 STA MEMHI
 PLA
 SEC
 SBC #1
 BNE MDLOOP
 JSR TRANSFR1 ;"(return/esc)" C=0 on return, C=1 on esc
 DFB WAITCRC  ;code
 BCS WINDM10
 BCC MDAGAIN  ;do another screen full

********************************
*  COMDM - MENU
********************************

CMDMENU
 JSR TRANSFR1 ;FULL SCREEN
 DFB WINDFULC ;CODE
 JSR WRINIT1
:MORE LDA MSGAVAIL,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE

* MAX MESSAGE LENGTH IS 256 BYTES

 JSR WRINIT1
:MORE2 LDA MSGAVAL2,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE2

 JSR TRANSFR1 ;"(return/esc)" C=0 on return, C=1 on esc
 DFB WAITCRC  ;code
WINDM10 JSR TRANSFR1 ;redisplay windows
 DFB DISPONC  ;code

MTOM10 JMP MAIN11

*********************************
*  COMDJS - JSR
*********************************

*EXECUTE THE SUBROUTINE AT THE ADDRESS FOLLOWING
* THE "JS" COMMAND AND RETURN TO EXT2 COMMAND PROMPT.

COMDJS EQU *
 BEQ JSERR  ;IF NO ADDRESS FOLLOWS
 JSR CHKREAD  ;CHECK FOR VALID HEX PUT IN LETTER2 & LETTER1
 BCC JSCONT  ;IF OK
JSERR JMP TOERR1  ;INDICATE ERROR & GOTO MAIN11

*SET UP RTS SO USER ROUTINE RETURNS TO RESETJMP IN
* CARDS I/O SLOT

JSCONT LDA SLOTCN  ;SLOT # $CN
 PHA   ;HI BYTE OF RETURN ADDRESS
 LDA #RESETJMP-1 ;LOW BYTE OF RETURN ADDRESS
 PHA
 LDA LETTER1  ;LOW ADDRESS BYTE OF USER SUB
 STA SUBTRACE ;SUBTRACE IS OK TO USE
 LDA LETTER2  ;HI ADDRESS BYTE
 STA SUBTRACE+1
 JSR TRANSFR1 ;RESTORE THE Z PAGE & TEXT RAM
 DFB RESTTEXTC ;CODE
 JMP (SUBTRACE)

******************************
*  SUBROUTINES
******************************

* CLEAR ALL OF THE BREAKPOINTS

CLEARALL
 LDY POINT  ;GET POINTER
 BEQ CLRHARD  ;BP'S ALL GONE
 DEY   ;POINT AT BRL
 JSR TRANSFR1 ;REPLACE BRK WITH ORIG DATA
 DFB REPLACEC
 JMP CLEARALL ;LOOP UNTIL DONE
CLRHARD LDA #%11101111 ;DISABLE HARDWARE BREAK
 AND IERBUFF  ;SET IER FLAG FOR HARDWARE BREAK TO ZERO (CA1)
 STA IERBUFF
 RTS

* DISPLAY ONE LINE OF MEMORY

MEMDISP EQU *
 JSR DSMEMCOL ;DISPLAY MEMORY POINTER
 LDY #00
MMDISHEX
 JSR SPCBYTE  ;DISPLAY SPACE BYTE
 INY
 CPY #16
 BNE MMDISHEX
 LDX #2
 JSR TRANSFR1 ;2 SPACES
 DFB PRBL2C  ;CODE
 LDY #00
MMDISASC
 JSR TRANSFR1 ;LDA LOWADD,Y
 DFB LDAINDYC ;CODE

*CHANGE CONTROL CODES TO NORMAL LETTERS SO THEY DON'T
* MESS UP THE DISPLAY

 ORA #$80  ;FORCE TO NEGATIVE
 CMP #$FF  ;$FF IS NOT ALLOWED
 BEQ MAKEDOT
 CMP #$A0
 BGE MMDISOK
MAKEDOT LDA #"."  ;DISPLAY PERIOD
MMDISOK JSR TRANSFR1
 DFB COUTC  ;CODE
 INY   ;DISPLAY THE ASCII EQUIV
 CPY #16
 BNE MMDISASC
 JSR TRANSFR1 ;RETURN
 DFB CROUTC  ;CODE
 RTS

* DISPLAY CONTENTS OF MEMHI & MEMLOW
*DISPLAY USER SPECIFIED BANK

DSMEMCOL
 LDA MEMPBR
 STA PBRADD
 JSR TRANSFR1 ;PRINT BANK NUMBER
 DFB PRBYTEC  ;CODE
 LDA #"/"
 JSR TRANSFR1
 DFB COUTC  ;CODE
 LDA MEMHI
 STA HIADD
 LDX MEMLOW
 STX LOWADD
 JSR TRANSFR1
 DFB PRNTAXC  ;CODE
 LDA #":"
 JSR TRANSFR1
 DFB COUTC  ;CODE
 RTS

* DISPLAY SPACE AND LOWADD,Y AS HEX BYTE

SPCBYTE LDA #$A0
 JSR TRANSFR1
 DFB COUTC  ;CODE
 JSR TRANSFR1
 DFB LDAINDYC ;CODE
 JSR TRANSFR1
 DFB PRBYTEC  ;CODE
 RTS

* IGNORES SPACES & RETURNS WITH Z BIT SET WHEN BUFFER EMPTY.

GETCHR LDA IN,Y  ;GET CHARACTER
 INY
 DEX   ;SETS ZFLAG WHEN BUFFER EMPTY
 BEQ EMPTY
 CMP #$A0  ;IS CHARACTER A SPACE
 BEQ GETCHR  ;IGNORE SPACES
EMPTY RTS

* READ IN THE NUMBERS (DEFAULT TO HEX, "!" = DECIMAL)
* PUT IN (LETTER 3,2,1) OR (LETTER 3,2,1 . LETTER 6,5,4)
* ALLOW THE FOLLOWING AS VALID $0001, $ 0001, $1, 1, C1B ETC.
* C = 1 IF NO NUMBER OR INVALID CHARACTER

CHKREAD DEY   ;PUT POINTERS BACK
 INX   ;TO LOOK AT LAST CHARACTER
CHKREADA
 LDA #0
 STA ADDRS2F  ;CLEAR FLAGS
 STA INLENGTH
READAD2 LDA #0
 STA DTOHFLG  ;DEFAULT TO HEX	
 JSR CLRLETER ;CLEAR LETTER 1,2,3
SKIPDLR JSR GETCHR  ;GET NEXT CHAR (IGNORE SPACES)
 BEQ CKRDERR  ;ERROR
 CMP #"$"  ;IS CHAR A DOLLAR SIGN
 BEQ SKIPDLR  ;IF YES
 CMP #"!"  ;DECIMAL NUMBER ?
 BNE READAD  ;IF NO
 STA DTOHFLG  ;IF YES, SET DEC TO HEX FLAG
 BEQ SKIPDLR 

* READ ADDRESS IN, CONVERT TO HEX, STORE IN LETTER 1,2,3
* INLENGTH CONTAINS NUMBER OF DIGITS READ

READAD CMP #$B0  ;IS IT < "0"
 BLT CKRDERR  ;IF YES
 CMP #$BA
 BLT ISDEC  ;IS 0-9
 CMP #$C1  ;COMPARE WITH "A"
 BLT CKRDERR
 CMP #$C7
 BGE CKRDERR
 BIT DTOHFLG  ;SUPPOSED TO BE DECIMAL ?
 BPL ITISHEX  ;IF NO

CKRDERR SEC
 RTS   ;******** ERROR RTS ********

ITISHEX CLC   ;CLEAR CARRY
 ADC #$9  ;ADD 9 TO CONVERT TO A-F
ISDEC AND #$F  ;STRIP MOST SIG. DIGIT
 STY YBUFF
 LDY #4
:SHIFT ASL LETTER1  ; -KEEP SHIFTING IN NEW DIGITS
 ROL LETTER2  ; - FROM THE RIGHT UNTIL
 ROL LETTER3
 DEY   ; - OUT OF DIGITS
 BNE :SHIFT
 ORA LETTER1
 STA LETTER1
 LDY YBUFF  ;RESTORE
 INC INLENGTH
 JSR GETCHR  ;GET NEXT CHAR IF ANY
 BEQ READAEND
 CMP #"/"  ;NEW BANK ?
 BNE :CHKPER  ;IF NO
 BIT DTOHFLG  ;CONVERT TO HEX ?
 BPL :INHEX  ;IF NO
 JSR DECHEX  ;CONVERT
:INHEX LDA LETTER1
 STA MEMPBR  ;NEW PBR
 JMP READAD2
:CHKPER CMP #"."  ;PERIOD MEANS SECOND NUMBER
 BEQ ADDRS2  ;READ SECOND NUMBER
 CMP #"]"
 BEQ READAEND
 CMP #")"
 BEQ READAEND
 CMP #","  ;USE COMMA AS DELIMITER
 BNE READAD
READAEND
 BIT DTOHFLG  ;CONVERT DEC TO HEX ?
 BPL :INHEX  ;IF NO
 JSR DECHEX  ;CONVERT
:INHEX LDA MEMPBR  ;DEFAULT TO CURRENT MEMPBR
 STA LETTER3
 BIT ADDRS2F  ;2 NUMBERS ENTERED ?
 BPL :ONE  ;IF NO
 JSR SWAPLET  ;IF YES, SWAP LETTERS
:ONE LDA LETTER1  ;LOW BYTE
 CLC
 RTS   ;RETURN WHEN OUT OF CHARACTERS

* TRANSFER LETTER 3,2,1 TO LETTER 6,5,4
* READ SECOND NUMBER INTO LETTER 3,2,1

ADDRS2 STA ADDRS2F  ;SET 2 ADDRESS FLAG
 BIT DTOHFLG  ;CONVERT DEC TO HEX ?
 BPL :INHEX  ;IF NO
 JSR DECHEX  ;CONVERT
:INHEX JSR SWAPLET  ;SWAP LETTER 1,2,3 WITH LETTER 4,5,6
 LDA MEMPBR  ;DEFAULT TO CURRENT MEMPBR
 STA LETTER6
 JMP READAD2  ;READ NEXT NUMBER	

*WRITE OUT THE STRING WHO'S ADDRESS IS STORED IN HIADD &
* LOWADD

****************************************
* MUST BE BEFORE $CF00
****************************************

WRINIT1 STY YBUFF  ;SAVE
 LDY #0
WRITMOR1
 CMP $C800  ;DISABLE EXTRAM
 CLC   ;NOT FINISHED FLAG
 RTS

WRITECK1
 CMP $CF00  ;ENABLE RAM
 INY   ;INCREMENT POINTER
 CMP #EOT  ;IS IT EOT
 BEQ WRITDON1 ;IF YES WRITE IS DONE
 AND #$FF  ;SET FLAGS
 BMI NOSPACE  ;IF MSB HI
 TAX
 JSR TRANSFR1 ;PRINT SPACES
 DFB PRBL2C  ;CODE
 LDA #" "
NOSPACE JSR TRANSFR1 ;DISPLAY ON OUTPUT DEVICE
 DFB COUTC  ;CODE
 JMP WRITMOR1 ;WRITE MORE CHARACTERS
WRITDON1
 RTS

* DISPLAY THE BREAKPOINTS

DISBKP JSR WRINIT1
:MORE LDA MSGBRKPT,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE

 LDY POINT  ;GET BREAKPOINT BUFFER POINTER
 BEQ :DSEND  ;ALL DONE
 LDX #3
:DISNEXT
 DEY
 TXA
 PHA   ;SAVE X
 JSR DSPBRK
 PLA
 TAX   ;RESTORE X
 DEX   ;END OF ROW?
 BNE :SPC  ;IF NO
 LDX #3  ;3 BRKS PER ROW
 LDA IOMODE  ;CHECK I/O MODE
 BEQ :NOTSER  ;SKIP CR IF SCREEN I/O
 LDA #CR
 BNE :NOSPC
:SPC LDA #$A0
:NOSPC JSR TRANSFR1 ;SPACE
 DFB COUTC  ;code
:NOTSER CPY #0
 BNE :DISNEXT
:DSEND RTS

***** DISPLAY THE BREAKPOINT INFO POINTED TO BY Y *****

DSPBRK LDX SLOTN0
****************************************
* !!! ALERT !!! SEGMENT DEPENDENT CODE *
****************************************
 LDA #%01100001 ;RAM6, ROM1
 STA SEGMBASE,X
 LDA BRKTGLOW,Y
 PHA
 LDA BRKTGHI,Y
 PHA
 LDA BRKLOW,Y
 PHA
 LDA BRKHI,Y
 PHA
 LDA BRKPBR,Y
 PHA
 LDA BRKTYPE,Y
 PHA
****************************************
* !!! ALERT !!! SEGMENT DEPENDENT CODE *
****************************************
 LDA #%00000001 ;RAM0, ROM1
 STA SEGMBASE,X
 PLA
 JSR TRANSFR1 ;PRINT TYPE
 DFB COUTC  ;code
 PLA
 JSR TRANSFR1 ;PRINT BANK NUMBER
 DFB PRBYTEC  ;code
 LDA #"/"
 JSR TRANSFR1
 DFB COUTC  ;code
 PLA
 JSR TRANSFR1 ;PRINT ADDRS
 DFB PRBYTEC  ;code
 PLA
 JSR TRANSFR1
 DFB PRBYTEC  ;code
 LDA #"."
 JSR TRANSFR1 ;PRINT "."
 DFB COUTC  ;code
 PLA
 JSR TRANSFR1 ;PRINT NUMBER
 DFB PRBYTEC  ;code
 PLA
 JSR TRANSFR1
 DFB PRBYTEC  ;code
 RTS

DISHB JSR WRINIT1
:MORE LDA MSGHARDB,Y ;"HARD BREAKPOINT"
 JSR WRITECK1
 BCC :MORE

DSPHBP LDA IERBUFF  ;GET IER BUFFER
 AND #%00010000 ;STRIP ALL BUT CB1 FLAG
 BEQ HARDBOFF ;DISABLED
 LDA HARDPBR  ;BANK #
 JSR TRANSFR1
 DFB PRBYTEC
 LDA #"/"
 JSR TRANSFR1 ;PRINT "/"
 DFB COUTC  ;code
 LDA VIAORB
 JSR TRANSFR1 ;PRINT HI BYTE OF ADDRESS
 DFB PRBYTEC  ;CODE
 LDA VIAORA
 JSR TRANSFR1 ;PRINT LOW BYTE OF ADDRESS
 DFB PRBYTEC  ;CODE
HARDBOFF
 RTS

***** MUST BE ABOVE $CF00 *****
* DISPLAY INVALID BREAKPOINT MESSAGE

DISINVBP
 JSR WRINIT1
:MORE LDA MSGINVBP,Y ;GET CHAR
 JSR WRITECK1 ;DISPLAY
 BCC :MORE
 RTS

** CONVERT THE DECIMAL NUMBER IN LETTER 3,2,1 TO HEX

DECHEX STX XBUFF
 LDX #2
:LOADDEC
 LDA LETTER1,X ;LETTER 1,2,3 TO
 STA DECIMAL1,X ;DECIMAL 1,2,3
 DEX
 BPL :LOADDEC
 JSR CLRLETER ;LETTER 1,2,3 TO 0
 LDX DECIMAL3 ;M.S. 2 DIGITS
 BEQ :TRYDEC2
:DEC3 LDA #$10  ;ADD 10,000 DEC
 JSR ADDL1  ;
 LDA #$27  ;IN HEX FORM $2710
 CLC
 JSR ADDL2
 JSR SUBD1
 BNE :DEC3  ;MORE 10,000
:TRYDEC2
 LDX DECIMAL2
 BEQ :TRYDEC1
:DEC2 LDA #$64
 JSR ADDL1
 JSR SUBD1
 BNE :DEC2
:TRYDEC1
 LDX DECIMAL1
 BEQ DHRTS
:DEC1 LDA #1
 JSR ADDL1
 JSR SUBD1
 BNE :DEC1
DHRTS LDX XBUFF  ;RESTORE
 RTS

ADDL1 CLC
 ADC LETTER1
 STA LETTER1
 LDA #0
ADDL2 ADC LETTER2
 STA LETTER2
 LDA #0
 ADC LETTER3
 STA LETTER3
 RTS

SUBD1 TXA
 SED
 SEC
 SBC #1
 CLD
 TAX
 RTS

CLRLETER
 LDA #0
 STA LETTER1
 STA LETTER2
 STA LETTER3
 RTS

* SWAP LETTER 1,2,3 WITH LETTER 4,5,6

SWAPLET STX XBUFF
 STY YBUFF
 LDX #2
:SWAP LDA LETTER1,X
 LDY LETTER4,X
 STA LETTER4,X
 TYA
 STA LETTER1,X
 DEX
 BPL :SWAP
 LDY YBUFF
 LDX XBUFF
 RTS

********* SAVE THE ACC,X AND P REGISTERS ********

SAVEAXP1
 PHP   ;SAVE STATUS
 STX XSAVESEG
 STA ASAVESEG
 PLA   ;GET STATUS
 STA PSAVESEG ;SAVE
 RTS

******** RESTORE THE ACC,X AND P REGISTERS *******

RESTAXP1
 LDX XSAVESEG
 LDA PSAVESEG
 PHA
 LDA ASAVESEG
 PLP
 RTS

***** GLOBAL SUBROUTINES IN THIS SEGMENT *****

SUBTABL1

GETCHRC EQU *-SUBTABL1*4+1+$100
 DA GETCHR-1

CHKREADC EQU *-SUBTABL1*4+1+$100
 DA CHKREAD-1

CHKREADAC EQU *-SUBTABL1*4+1+$100
 DA CHKREADA-1

DSMEMCOLC EQU *-SUBTABL1*4+1+$100
 DA DSMEMCOL-1

DSPBRKC EQU *-SUBTABL1*4+1+$100
 DA DSPBRK-1

DSPHBPC EQU *-SUBTABL1*4+1+$100
 DA DSPHBP-1

*****************************************
*  SEGMENT CROSSOVER AREA  *
*****************************************

 LST ON
S1END = $CF9D-*
 do nolist
 LST OFF
 fin
 ERR *-1/$CF9D
 DS $CF9D-*,$FF

MAIN11 JSR SAVEAXP1 ;COME HERE TO TRANSFER TO SEGMENT5 DIRECTLY
 LDX SLOTN0
 LDA #%00000101 ;RAM0,ROM5
 STA SEGMBASE,X ;NEXT INSTRUCTION EXECUTED FROM SEGMENT 5
 JSR RESTAXP1 ;RESTORE AFTER TRANSFER FROM SEGMENT 5
 RTS   ;GOTO TO COMMAND IN THIS SEGMENT
 NOP
 NOP   ;MATCH LENGTH WITH SEGMENT 5

* TRANSFER TO OTHER SEGMENTS

TRANSFR1

 JSR SAVEAXP1
 PLA   ;GET RETRUN ADDRESS FROM STACK
 CLC
 ADC #1  ;INC TO POINT AT CODE BYTE
 STA TEMPSEG  ;SETUP LDA TEMPSEG ROUTINE
 PLA
 ADC #0  ;ADD CARRY, IF ANY
 STA TEMPSEG+1 ;SETUP LDA TEMPSEG ROUTINE
 PHA
 LDA TEMPSEG
 PHA   ;BUMP RETURN ADDRESS PAST CODE BYTE
 LDA #1  ;CURRENT SEG #
 PHA
 JSR LDATEMP  ;LOAD CODE BYTE
 STA SEGMCODE ;SAVE CODE
 AND #$07  ;STRIP ALL BUT SEG #
 LDX SLOTN0
 STA SEGMBASE,X ;NEXT INSTR. RUN FROM NEW SEGMENT
* NEW SEGMENT
 LDA #>RETURN1 ;WHERE TO RETURN TO
 PHA
 LDA #RETURN1
 PHA
 LDA SEGMCODE ;CODE BYTE
 AND #$F8  ;STIP OFF SEG# LEAVING SUB #
 LSR
 LSR   ;LEAVE SUB# MULTIPLIED BY 2
* GET ADDRESS OF SUB FROM SUBTABL & PUSH ON STACK
 TAX
 LDA SUBTABL1+1,X ;HI BYTE FIRST
 PHA
 LDA SUBTABL1,X
 PHA

 JSR RESTAXP1 ;RESTORE REGISTERS
 RTS   ;USE RTS TO GOTO SUB

* RETURN HERE FROM SUBROUTINE

RETURN1 EQU *-1
 JSR SAVEAXP1
 PLA   ;SEG # TO RETURN TO
 LDX SLOTN0
 STA SEGMBASE,X ;RETURN TO SEGMENT
 JSR RESTAXP1
 RTS   ;RETURN TO CALLING PROGRAM

 DS \,$FF ;PUT OBJECT AT NEXT PAGE
